/*
 * Copyright (C) 2011 SANSOU SYSTEMS Co., Ltd. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.co.sansou.android.atnd.common;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateUtils;

public class Util {

	/**
	 * ISO8601形式の日付文字列をDateオブジェクトに変換して返します。
	 * 
	 * @param strDate
	 *            ISO8601形式の日付文字列（yyyyMMdd'T'HHmmss.SSSZ）
	 * @return Dateオブジェクト（変換不可の場合はnullを返す）
	 */
	public static Date formatDateIso8601(String strDate) {
		Date result;
		try {
			result = DateUtils.parseDate(strDate, AtndConst.ISO8601_FORMAT);
		} catch (ParseException e) {
			result = null;
		} catch (Exception e) {
			result = null;
		}
		return result;
	}

	public static String dateToStr(Date date) {
		String result = null;
		if (date != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
			result = sdf.format(date);
		}
		return result;
	}

	public static String dateToStrDatetime(Date date) {
		String result = null;
		if (date != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
			result = sdf.format(date);
		}
		return result;
	}

	public static Date strToDate(String strDate) throws ParseException {
		Date result = null;
		if (strDate != null) {
			SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
			result = format.parse(strDate);
		}
		return result;
	}

	/**
	 * <pre>
	 * DatePickerDialogのOnDateSetListenerでonDateSetコールバックメソッドが呼ばれた際の
	 * 引数に指定されている3つのパラメータをそのまま指定し、yyyy/MM/dd形式の文字列にして返します。
	 * </pre>
	 * 
	 * @param year
	 *            年
	 * @param monthOfYear
	 *            月
	 * @param dayOfMonth
	 *            日
	 * @return yyyy/MM/dd形式の文字列
	 */
	public static String datepickerValueToStr(int year, int monthOfYear,
			int dayOfMonth) {
		String strYear = String.valueOf(year);
		String strMonth = monthOfYear + 1 < 10 ? "0" + (monthOfYear + 1)
				: String.valueOf(monthOfYear + 1);
		String strDay = dayOfMonth < 10 ? "0" + dayOfMonth : String
				.valueOf(dayOfMonth);

		return strYear + "/" + strMonth + "/" + strDay;
	}

	/**
	 * <pre>
	 * 指定された日付文字列をCalendar型にして返します。
	 * </pre>
	 * 
	 * @param strCalendar
	 *            日付文字列（yyyy/MM/dd）
	 * @return <pre>
	 * Calendarオブジェクト
	 * 指定された文字列が日付型でない場合は今日の日付を返します。
	 * </pre>
	 */
	public static Calendar strToCalendar(String strCalendar) {
		Calendar result = null;
		if (!StringUtils.isEmpty(strCalendar)) {
			try {
				result = Calendar.getInstance(Locale.JAPANESE);
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
				result.setTime(sdf.parse(strCalendar));
			} catch (Exception e) {
				System.err.println(e.getMessage() + "\n" + e.getStackTrace());
			}
		}
		return result;
	}

	/**
	 * <pre>
	 * 指定された日付（Calendar型）を文字列（yyyy/MM/dd）にして返します。
	 * </pre>
	 * 
	 * @param calendar
	 *            画面上に表示する対象となる日付
	 * @return <pre>
	 * 文字列へ変換後の日付（yyyy/MM/dd）
	 * 引数のcalendarがnullの場合は本日の日付文字列を返します。
	 */
	public static String calendarToStr(Calendar calendar) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		String result = null;
		if (calendar == null) {
			result = sdf.format(new Date());
		} else {
			result = sdf.format(calendar.getTime());
		}
		return result;
	}

	public static String calendarToStrNumeric(Calendar calendar) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String result = "";
		if (calendar == null) {
			result = sdf.format(new Date());
		} else {
			result = sdf.format(calendar.getTime());
		}
		return result;
	}

	/**
	 * <pre>
	 * 日付に指定された日数分を追加した日付型を返します。
	 * </pre>
	 * 
	 * @param calendar
	 *            加減対象の日付（Calendar型）
	 * @param addDays
	 *            加減する日数
	 * @return 加減後の日付（Calendar型）
	 */
	public static Calendar addDate(Calendar calendar, int addDays) {
		Calendar result = null;
		if (calendar != null) {
			result = Calendar.getInstance();
			result.clear();
			result.set(calendar.get(Calendar.YEAR),
					calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
		}
		result.add(Calendar.DATE, addDays);
		return result;
	}

	/**
	 * <pre>
	 * 日付に指定された月数分を追加した日付型を返します。
	 * </pre>
	 * 
	 * @param calendar
	 *            加減対象の日付（Calendar型）
	 * @param addMonths
	 *            加減する日数
	 * @return 加減後の日付（Calendar型）
	 */
	public static Calendar addMonth(Calendar calendar, int addMonths) {
		Calendar result = null;
		if (calendar != null) {
			result = calendar;
		}
		result.add(Calendar.MONTH, addMonths);
		return result;
	}

	/**
	 * <pre>
	 * 指定された日付文字列（yyyy/MM/dd）を
	 * 曜日を含んだ日付文字列（yyyy/MM/dd（E））に
	 * 変換して返します。
	 * </pre>
	 * 
	 * @param strDate
	 *            日付文字列（yyyy/MM/dd）
	 * @return <pre>
	 * 曜日を含んだ日付文字列（yyyy/MM/dd（E））
	 * nullが指定された場合はnullを返します。
	 * </pre>
	 */
	public static String getDateYmdeFmtStr(String strDate) {
		String result = null;
		if (strDate != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd（E）",
					Locale.JAPANESE);
			Calendar cal = strToCalendar(strDate);
			result = sdf.format(cal.getTime());
		}
		return result;
	}

	/**
	 * <pre>
	 * 指定された日付文字列（yyyy/MM/dd（E））を
	 * 曜日を含まない日付文字列（yyyy/MM/dd）に
	 * 変換して返します。
	 * </pre>
	 * 
	 * @param strDate
	 *            曜日を含んだ日付文字列（yyyy/MM/dd（E））
	 * @return <pre>
	 * 曜日を含まない日付文字列（yyyy/MM/dd）
	 * nullが指定された場合はnullを返します。
	 * </pre>
	 */
	public static String getDateYmdFmtStr(String strDate) {
		String result = null;
		if (strDate != null) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd",
					Locale.JAPANESE);
			Calendar cal = strToCalendar(strDate);
			result = sdf.format(cal.getTime());
		}
		return result;
	}

	/**
	 * <pre>
	 * 指定された日付（Calendar型）から曜日を文字列で返します。
	 * </pre>
	 * 
	 * @param calendar
	 *            日付
	 * @return 曜日
	 */
	public static String getDayOfWeek(Calendar calendar) {
		String result = null;
		SimpleDateFormat sdf = new SimpleDateFormat("（E）");
		if (calendar != null) {
			result = sdf.format(calendar.getTime());
		}
		return result;
	}

	public static String[] splitSpace(String param) {
		String[] result = null;
		if (!StringUtils.isEmpty(param)) {
			result = param.replaceAll("　", " ").split(" ", 0);
		}
		return result;
	}

	public static String[] splitComma(String param) {
		String[] result = null;
		if (!StringUtils.isEmpty(param)) {
			result = param.split(",", 0);
		}
		return result;
	}

	public static String getJsonString(String param) {
		String result = null;
		if (!(StringUtils.isEmpty(param) || "null".equals(param))) {
			result = param;
		}
		return result;
	}
}
